Terraform の Module Registry で使用しているモジュールのバージョンを更新する
ちゃだいん(@chazuke4649)です。
Module Registry のモジュールを利用している環境で、モジュールのバージョン更新をする機会があったので紹介します。 (ドンピシャの記事を見つけられなかったので、書きました)
前提
モジュールレジストリからインストールされたモジュールを使用する場合は、予期しない変更や不要な変更を避けるために、可能なバージョンを明示的に指定することが推奨されています。 以下ドキュメントのサンプルです。
module "consul" { source = "hashicorp/consul/aws" version = "0.0.5" servers = 3 }
Modules - Configuration Language - Terraform by HashiCorp
やってみた
以下VPCモジュールのバージョンを 3.7.0
から、現時点で最新である 3.10.0
に更新します。
terraform-aws-modules/vpc/aws | Terraform Registry
まず、現時点でModuleブロックは以下のような記述になっています。
module "vpc" { source = "terraform-aws-modules/vpc/aws" version = "3.7.0" name = "example" }
この状態で terraform init
をすると、特に何もおきません。
% terraform init Initializing modules... Initializing the backend... Initializing provider plugins... - Reusing previous version of hashicorp/aws from the dependency lock file - Using previously-installed hashicorp/aws v3.63.0 Terraform has been successfully initialized!
ちなみに、ここで terraform init -upgarade
を実行すると、すでにダウンロード済みのモジュールであっても再度ダウンロードされます。(例えば本来は新しい子モジュールを呼び出す場合に実行するようです)
% terraform init -upgrade Upgrading modules... Downloading terraform-aws-modules/vpc/aws 3.7.0 for vpc... - vpc in .terraform/modules/vpc Initializing the backend... Initializing provider plugins... - Finding hashicorp/aws versions matching ">= 3.38.0, 3.63.0"... - Using previously-installed hashicorp/aws v3.63.0 Terraform has been successfully initialized!
Moduleブロックのバージョン指定を変更します。
module "vpc" { source = "terraform-aws-modules/vpc/aws" version = "3.10.0" name = "example" }
次に terraform plan
すると怒られます。
% terraform plan ╷ │ Error: Module version requirements have changed │ │ on main.tf line 1, in module "vpc": │ 1: source = "terraform-aws-modules/vpc/aws" │ │ The version requirements have changed since this module was installed and │ the installed version (3.7.0) is no longer acceptable. Run "terraform init" │ to install all modules required by this configuration.
言われた通りに terraform init
を実行します。
% terraform init Initializing modules... Downloading terraform-aws-modules/vpc/aws 3.10.0 for vpc... - vpc in .terraform/modules/vpc Initializing the backend... Initializing provider plugins... - Reusing previous version of hashicorp/aws from the dependency lock file - Using previously-installed hashicorp/aws v3.63.0 Terraform has been successfully initialized!
これで最新バージョンのモジュールがダウンロードされました。
それではモジュールのバージョン変更によって、定義されるリソースに差異がないか確認します。
% terraform plan module.vpc.aws_vpc.this[0]: Refreshing state... [id=vpc-xxxxxxxxxxxxxx] .... No changes. Your infrastructure matches the configuration. Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.
上記の通り変更はありませんでした。これによって最新バージョンでサポートされたパラメータや実装があれば、利用することができます。
余談:戻したい場合は?
上記でplanした場合に、万が一変更が多すぎてやっぱり戻したいとなったら、どうすれば良いでしょうか。
(根本解決にはなってないかもですが) 単純にModuleブロックのバージョンを元に戻して(例:3.10.0 -> 3.7.0)、terraform init
すれば元の状態に戻れます。
終わりに
それにしても Module Registry便利ですね。感謝しながら活用していきたいです。
それではこの辺で。ちゃだいん(@chazuke4649)でした。